WebAssembly μμΈ μ²λ¦¬ λ° μ€ν νΈλ μ΄μ€ μ¬μΈ΅ λΆμ. λ€μν νλ«νΌμμ κ°λ ₯νκ³ λλ²κΉ κ°λ₯ν μ ν리μΌμ΄μ ꡬμΆμ μν μ€λ₯ 컨ν μ€νΈ 보쑴μ μ€μμ±μ μ΄μ μ λ§μΆ₯λλ€.
WebAssembly μμΈ μ²λ¦¬ μ€ν νΈλ μ΄μ€: κ°λ ₯ν μ ν리μΌμ΄μ μ μν μ€λ₯ 컨ν μ€νΈ 보쑴
WebAssembly(Wasm)λ κ³ μ±λ₯μ ν¬λ‘μ€ νλ«νΌ μ ν리μΌμ΄μ ꡬμΆμ μν κ°λ ₯ν κΈ°μ λ‘ λΆμνμ΅λλ€. μλλ°μ€νλ μ€ν νκ²½κ³Ό ν¨μ¨μ μΈ λ°μ΄νΈμ½λ νμμ μΉ μ ν리μΌμ΄μ λ° μλ² μΈ‘ λ‘μ§λΆν° μλ² λλ μμ€ν λ° κ²μ κ°λ°μ μ΄λ₯΄κΈ°κΉμ§ κ΄λ²μν μ¬μ© μ¬λ‘μ μ΄μμ μ λλ€. WebAssemblyμ μ±νμ΄ μ¦κ°ν¨μ λ°λΌ μ ν리μΌμ΄μ μμ μ±μ 보μ₯νκ³ ν¨μ¨μ μΈ λλ²κΉ μ μ΄μ§νκΈ° μν΄ κ°λ ₯ν μ€λ₯ μ²λ¦¬κ° μ μ λ μ€μν΄μ§κ³ μμ΅λλ€.
μ΄ κΈμμλ WebAssembly μμΈ μ²λ¦¬μ 볡μ‘μ±κ³Ό, λ μ€μνκ²λ μ€ν νΈλ μ΄μ€μμ μ€λ₯ 컨ν μ€νΈλ₯Ό 보쑴νλ λ° μ€μν μν μ νꡬν©λλ€. κ΄λ ¨ λ©μ»€λμ¦, μ§λ©΄νλ κ³Όμ , κ·Έλ¦¬κ³ λ€μν νκ²½ λ° μν€ν μ²μμ λ°μνλ λ¬Έμ λ₯Ό μ μνκ² μλ³νκ³ ν΄κ²°ν μ μλλ‘ μλ―Έ μλ μ€λ₯ μ 보λ₯Ό μ 곡νλ Wasm μ ν리μΌμ΄μ ꡬμΆμ μν λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄λ³Ό κ²μ λλ€.
WebAssembly μμΈ μ²λ¦¬ μ΄ν΄
WebAssemblyλ μ€κ³μ μμΈ μν©μ μ²λ¦¬νλ λ©μ»€λμ¦μ μ 곡ν©λλ€. λ°ν μ½λλ μ μ μ€λ₯ νλκ·Έμ ν¬κ² μμ‘΄νλ μΌλΆ μΈμ΄μ λ¬λ¦¬, WebAssemblyλ λͺ μμ μΈ μμΈ μ²λ¦¬λ₯Ό ν΅ν©νμ¬ μ½λ λͺ νμ±μ κ°μ νκ³ λͺ¨λ ν¨μ νΈμΆ ν μ€λ₯λ₯Ό μλμΌλ‘ νμΈν΄μΌ νλ κ°λ°μμ λΆλ΄μ μ€μ¬μ€λλ€. Wasmμ μμΈλ μΌλ°μ μΌλ‘ μ£Όλ³ μ½λ λΈλ‘μμ μ‘νκ³ μ²λ¦¬λ μ μλ κ°μΌλ‘ ννλ©λλ€. μ΄ νλ‘μΈμ€λ μΌλ°μ μΌλ‘ λ€μ λ¨κ³λ₯Ό ν¬ν¨ν©λλ€.
- μμΈ λ°μ: μ€λ₯ μ‘°κ±΄μ΄ λ°μνλ©΄ Wasm ν¨μλ μμΈλ₯Ό "λμ§" μ μμ΅λλ€. μ΄λ νμ¬ μ€ν κ²½λ‘κ° λ³΅κ΅¬ λΆκ°λ₯ν λ¬Έμ μ μ§λ©΄νμμ λνλ λλ€.
- μμΈ μ‘κΈ°: μμΈλ₯Ό λ°μμν¬ μ μλ μ½λ μ£Όμμλ "catch" λΈλ‘μ΄ μμ΅λλ€. μ΄ λΈλ‘μ νΉμ μ νμ μμΈκ° λ°μν κ²½μ° μ€νλ μ½λλ₯Ό μ μν©λλ€. μ¬λ¬ catch λΈλ‘μ΄ λ€λ₯Έ μ νμ μμΈλ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
- μμΈ μ²λ¦¬ λ‘μ§: catch λΈλ‘ λ΄μμ κ°λ°μλ μ€λ₯ λ‘κΉ , μ€λ₯ 볡ꡬ μλ λλ μ ν리μΌμ΄μ μ μ°μν μ’ λ£μ κ°μ μ¬μ©μ μ§μ μ€λ₯ μ²λ¦¬ λ‘μ§μ ꡬνν μ μμ΅λλ€.
μ΄λ¬ν ꡬ쑰νλ μμΈ μ²λ¦¬ μ κ·Ό λ°©μμ λͺ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- ν₯μλ μ½λ κ°λ μ±: λͺ μμ μΈ μμΈ μ²λ¦¬λ μ€λ₯ μ²λ¦¬ λ‘μ§μ λ μ 보μ΄κ² νκ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€. μ΄λ μ μμ μΈ μ€ν νλ¦κ³Ό λΆλ¦¬λμ΄ μκΈ° λλ¬Έμ λλ€.
- μμ©κ΅¬ μ½λ κ°μ: κ°λ°μλ λͺ¨λ ν¨μ νΈμΆ ν μ€λ₯λ₯Ό μλμΌλ‘ νμΈν νμκ° μμ΄ λ°λ³΅μ μΈ μ½λ μμ΄ μ€μ΄λλλ€.
- ν₯μλ μ€λ₯ μ ν: μμΈλ μ‘ν λκΉμ§ νΈμΆ μ€νμ λ°λΌ μλμΌλ‘ μ νλμ΄ μ€λ₯κ° μ μ νκ² μ²λ¦¬λλλ‘ λ³΄μ₯ν©λλ€.
μ€ν νΈλ μ΄μ€μ μ€μμ±
μμΈ μ²λ¦¬λ μ€λ₯λ₯Ό μ°μνκ² κ΄λ¦¬νλ λ°©λ²μ μ 곡νμ§λ§, λ¬Έμ μ κ·Όλ³Έ μμΈμ μ§λ¨νλ λ°λ μ’ μ’ μΆ©λΆνμ§ μμ΅λλ€. μ΄λ μ€ν νΈλ μ΄μ€κ° μ€μν΄μ§λλ€. μ€ν νΈλ μ΄μ€λ μμΈκ° λ°μν μμ μ νΈμΆ μ€νμ ν μ€νΈλ‘ ννν κ²μ λλ€. μ€λ₯κ° λ°μν κ³Όμ μ 보μ¬μ£Όμ΄ μ€λ₯κ° μ΄λ»κ² λ°μνλμ§ μ΄ν΄νλ λ° κ·μ€ν 컨ν μ€νΈλ₯Ό μ 곡ν©λλ€.
μΌλ°μ μΈ μ€ν νΈλ μ΄μ€μλ μ€νμ κ° ν¨μ νΈμΆμ λν΄ λ€μκ³Ό κ°μ μ λ³΄κ° ν¬ν¨λ©λλ€.
- ν¨μ μ΄λ¦: νΈμΆλ ν¨μμ μ΄λ¦μ λλ€.
- νμΌ μ΄λ¦: ν¨μκ° μ μλ μμ€ νμΌμ μ΄λ¦μ λλ€(μ¬μ© κ°λ₯ν κ²½μ°).
- μ€ λ²νΈ: ν¨μ νΈμΆμ΄ λ°μν μμ€ νμΌμ μ€ λ²νΈμ λλ€.
- μ΄ λ²νΈ: ν¨μ νΈμΆμ΄ λ°μν μ€μ μ΄ λ²νΈμ λλ€(λ μΌλ°μ μ΄μ§λ§ μ μ©ν¨).
μ€ν νΈλ μ΄μ€λ₯Ό κ²μ¬ν¨μΌλ‘μ¨ κ°λ°μλ μμΈλ‘ μ΄μ΄μ§ μ€ν κ²½λ‘λ₯Ό μΆμ νκ³ , μ€λ₯μ μΆμ²λ₯Ό μλ³νλ©°, μ€λ₯ λ°μ μ μ ν리μΌμ΄μ μ μνλ₯Ό μ΄ν΄ν μ μμ΅λλ€. μ΄λ 볡μ‘ν λ¬Έμ λ₯Ό λλ²κΉ νκ³ μ ν리μΌμ΄μ μμ μ±μ κ°μ νλ λ° λ§€μ° μ€μν©λλ€. WebAssemblyλ‘ μ»΄νμΌλ κΈμ΅ μ ν리μΌμ΄μ μ΄ μ΄μμ¨μ κ³μ°νλ€κ³ κ°μ ν΄ λ³΄κ² μ΅λλ€. μ¬κ· ν¨μ νΈμΆλ‘ μΈν΄ μ€ν μ€λ²νλ‘μ°κ° λ°μν©λλ€. μ νμνλ μ€ν νΈλ μ΄μ€λ μ¬κ· ν¨μλ₯Ό μ§μ κ°λ¦¬μΌ κ°λ°μκ° λ¬΄ν μ¬κ·λ₯Ό μ μνκ² μ§λ¨νκ³ μμ ν μ μλλ‘ ν©λλ€.
κ³Όμ : WebAssembly μ€ν νΈλ μ΄μ€μμ μ€λ₯ 컨ν μ€νΈ 보쑴
μ€ν νΈλ μ΄μ€μ κ°λ μ κ°λ¨νμ§λ§, WebAssemblyμμ μλ―Έ μλ μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. ν΅μ¬μ μ»΄νμΌ λ° μ€ν νλ‘μΈμ€ μ 체μμ μ€λ₯ 컨ν μ€νΈλ₯Ό 보쑴νλ κ²μ λλ€. μ¬κΈ°μλ μ¬λ¬ κ°μ§ μμκ° ν¬ν¨λ©λλ€.
1. μμ€ λ§΅ μμ± λ° κ°μ©μ±
WebAssemblyλ μ’ μ’ C++, Rust λλ TypeScriptμ κ°μ κ³ μμ€ μΈμ΄μμ μμ±λ©λλ€. μλ―Έ μλ μ€ν νΈλ μ΄μ€λ₯Ό μ 곡νκΈ° μν΄ μ»΄νμΌλ¬λ μμ€ λ§΅μ μμ±ν΄μΌ ν©λλ€. μμ€ λ§΅μ μ»΄νμΌλ WebAssembly μ½λλ₯Ό μλ³Έ μμ€ μ½λλ‘ λ€μ λ§€ννλ νμΌμ λλ€. μ΄λ₯Ό ν΅ν΄ λΈλΌμ°μ λλ λ°νμ νκ²½μ WebAssembly λ°μ΄νΈμ½λ μ€νμ λ§ νμνλ λμ μ€ν νΈλ μ΄μ€μ μλ³Έ νμΌ μ΄λ¦κ³Ό μ€ λ²νΈλ₯Ό νμν μ μμ΅λλ€. μ΄λ μ½λ μΆμ λλ λλ ν μ νΉν μ€μν©λλ€. μλ₯Ό λ€μ΄, TypeScriptλ₯Ό μ¬μ©νμ¬ μΉ μ ν리μΌμ΄μ μ ꡬμΆνκ³ μ΄λ₯Ό WebAssemblyλ‘ μ»΄νμΌνλ κ²½μ°, TypeScript μ»΄νμΌλ¬(tsc)λ₯Ό ꡬμ±νμ¬ μμ€ λ§΅(`--sourceMap`)μ μμ±ν΄μΌ ν©λλ€. λ§μ°¬κ°μ§λ‘ Emscriptenμ μ¬μ©νμ¬ C++ μ½λλ₯Ό WebAssemblyλ‘ μ»΄νμΌνλ κ²½μ°, λλ²κΉ μ 보λ₯Ό ν¬ν¨νκ³ μμ€ λ§΅μ μμ±νλ €λ©΄ `-g` νλκ·Έλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
νμ§λ§ μμ€ λ§΅μ μμ±νλ κ²μ μ λ°μ κ³Όμ μΌ λΏμ λλ€. λΈλΌμ°μ λλ λ°νμ νκ²½λ μμ€ λ§΅μ μ‘μΈμ€ν μ μμ΄μΌ ν©λλ€. μ΄λ μΌλ°μ μΌλ‘ WebAssembly νμΌκ³Ό ν¨κ» μμ€ λ§΅μ μ 곡νλ κ²μ ν¬ν¨ν©λλ€. κ·Έλ¬λ©΄ λΈλΌμ°μ λ μλμΌλ‘ μμ€ λ§΅μ λ‘λνκ³ μ€ν νΈλ μ΄μ€μ μλ³Έ μμ€ μ½λ μ 보λ₯Ό νμνλ λ° μ¬μ©ν©λλ€. λΈλΌμ°μ μ μμ€ λ§΅μ΄ μ‘μΈμ€ κ°λ₯νλλ‘ νλ κ²μ΄ μ€μν©λλ€. CORS μ μ± λλ κΈ°ν 보μ μ νμΌλ‘ μΈν΄ μ°¨λ¨λ μ μκΈ° λλ¬Έμ λλ€. μλ₯Ό λ€μ΄, WebAssembly μ½λμ μμ€ λ§΅μ΄ λ€λ₯Έ λλ©μΈμ νΈμ€ν λμ΄ μλ€λ©΄, λΈλΌμ°μ κ° μμ€ λ§΅μ μ‘μΈμ€νλλ‘ νμ©νκΈ° μν΄ CORS ν€λλ₯Ό ꡬμ±ν΄μΌ ν©λλ€.
2. λλ²κ·Έ μ 보 보쑴
μ»΄νμΌ νλ‘μΈμ€ μ€μ μ»΄νμΌλ¬λ μ’ μ’ μμ±λ μ½λμ μ±λ₯μ κ°μ νκΈ° μν΄ μ΅μ νλ₯Ό μνν©λλ€. μ΄λ¬ν μ΅μ νλ λλλ‘ λλ²κΉ μ 보λ₯Ό μ κ±°νκ±°λ μμ νμ¬ μ νν μ€ν νΈλ μ΄μ€λ₯Ό μμ±νκΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄, ν¨μλ₯Ό μΈλΌμΈνλ©΄ μ€λ₯λ‘ μ΄μ΄μ§ μλ ν¨μ νΈμΆμ κ²°μ νκΈ°κ° λ μ΄λ €μμ§ μ μμ΅λλ€. λ§μ°¬κ°μ§λ‘ μ£½μ μ½λ μ κ±°λ μ€λ₯μ κ΄μ¬νμ μ μλ ν¨μλ₯Ό μ κ±°ν μ μμ΅λλ€. Emscriptenκ³Ό κ°μ μ»΄νμΌλ¬λ μ΅μ ν μμ€ λ° λλ²κ·Έ μ 보 μ μ΄λ₯Ό μν μ΅μ μ μ 곡ν©λλ€. Emscriptenκ³Ό ν¨κ» `-g` νλκ·Έλ₯Ό μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° μμ±λ WebAssembly μ½λμ λλ²κΉ μ 보λ₯Ό ν¬ν¨νλλ‘ μ§μν©λλ€. λν μ±λ₯κ³Ό λλ²κΉ μ©μ΄μ±μ κ· νμ λ§μΆκΈ° μν΄ λ€λ₯Έ μ΅μ ν μμ€(`-O0`, `-O1`, `-O2`, `-O3`, `-Os`, `-Oz`)μ μ¬μ©ν μ μμ΅λλ€. `-O0`μ λλΆλΆμ μ΅μ νλ₯Ό λΉνμ±ννκ³ κ°μ₯ λ§μ λλ²κ·Έ μ 보λ₯Ό 보쑴νλ λ°λ©΄, `-O3`μ 곡격μ μΈ μ΅μ νλ₯Ό νμ±ννκ³ μΌλΆ λλ²κ·Έ μ 보λ₯Ό μ κ±°ν μ μμ΅λλ€.
μ±λ₯κ³Ό λλ²κΉ μ©μ΄μ± μ¬μ΄μ κ· νμ λ§μΆλ κ²μ΄ μ€μν©λλ€. κ°λ° νκ²½μμλ μΌλ°μ μΌλ‘ μ΅μ νλ₯Ό λΉνμ±ννκ³ κ°λ₯ν ν λ§μ λλ²κ·Έ μ 보λ₯Ό 보쑴νλ κ²μ΄ μ’μ΅λλ€. νλ‘λμ νκ²½μμλ μ±λ₯ κ°μ μ μν΄ μ΅μ νλ₯Ό νμ±νν μ μμ§λ§, μ€λ₯ λ°μ μ λλ²κΉ μ μ©μ΄νκ² νκΈ° μν΄ μΌλΆ λλ²κ·Έ μ 보λ₯Ό ν¬ν¨νλ κ²μ μ¬μ ν κ³ λ €ν΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ κ°λ° λ° νλ‘λμ μ λν΄ μλ‘ λ€λ₯Έ μ΅μ ν μμ€κ³Ό λλ²κ·Έ μ 보 μ€μ μ μ¬μ©νμ¬ λ³λμ λΉλ ꡬμ±μ μ¬μ©ν μ μμ΅λλ€.
3. λ°νμ νκ²½ μ§μ
λ°νμ νκ²½(μ: λΈλΌμ°μ , Node.js λλ λ 립ν WebAssembly λ°νμ)μ μ€ν νΈλ μ΄μ€ μμ± λ° νμμμ μ€μν μν μ ν©λλ€. λ°νμ νκ²½μ WebAssembly μ½λλ₯Ό ꡬ문 λΆμνκ³ , μμ€ λ§΅μ μ‘μΈμ€νλ©°, WebAssembly λ°μ΄νΈμ½λ μ€νμ μ μμ€ μ½λ μμΉλ‘ λ³νν μ μμ΄μΌ ν©λλ€. λͺ¨λ λ°νμ νκ²½μ΄ WebAssembly μ€ν νΈλ μ΄μ€μ λν΄ λμΌν μμ€μ μ§μμ μ 곡νλ κ²μ μλλλ€. μΌλΆ λ°νμ νκ²½μ WebAssembly λ°μ΄νΈμ½λ μ€νμ λ§ νμν μ μκ³ , λ€λ₯Έ λ°νμ νκ²½μ μλ³Έ μμ€ μ½λ μ 보λ₯Ό νμν μ μμ΅λλ€. μ΅μ λΈλΌμ°μ λ νΉν μμ€ λ§΅μ μ¬μ©ν μ μμ λ WebAssembly μ€ν νΈλ μ΄μ€λ₯Ό μ μ§μν©λλ€. Node.jsλ νΉν `--enable-source-maps` νλκ·Έλ₯Ό μ¬μ©ν λ WebAssembly μ€ν νΈλ μ΄μ€λ₯Ό μ μ§μν©λλ€. κ·Έλ¬λ μΌλΆ λ 립ν WebAssembly λ°νμμ μ€ν νΈλ μ΄μ€μ λν μ§μμ΄ μ νμ μΌ μ μμ΅λλ€.
μ€ν νΈλ μ΄μ€κ° μ¬λ°λ₯΄κ² μμ±λκ³ μλ―Έ μλ μ 보λ₯Ό μ 곡νλμ§ νμΈνκΈ° μν΄ λ€μν λ°νμ νκ²½μμ WebAssembly μ ν리μΌμ΄μ μ ν μ€νΈνλ κ²μ΄ μ€μν©λλ€. λ€μν νκ²½μμ μ€ν νΈλ μ΄μ€λ₯Ό μμ±νκΈ° μν΄ λ€λ₯Έ λꡬλ κΈ°μ μ μ¬μ©ν΄μΌ ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λΈλΌμ°μ μμ `console.trace()` ν¨μλ₯Ό μ¬μ©νμ¬ μ€ν νΈλ μ΄μ€λ₯Ό μμ±νκ±°λ Node.jsμμ `node --stack-trace-limit` νλκ·Έλ₯Ό μ¬μ©νμ¬ μ€ν νΈλ μ΄μ€μ νμλλ μ€ν νλ μ μλ₯Ό μ μ΄ν μ μμ΅λλ€.
4. λΉλκΈ° μμ λ° μ½λ°±
WebAssembly μ ν리μΌμ΄μ μλ μ’ μ’ λΉλκΈ° μμ λ° μ½λ°±μ΄ ν¬ν¨λ©λλ€. μ΄λ μ€ν κ²½λ‘κ° μ½λμ λ€λ₯Έ λΆλΆμΌλ‘ μ νν μ μμΌλ―λ‘ μ νν μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλ λ° λ μ΄λ €μΈ μ μμ΅λλ€. μλ₯Ό λ€μ΄, WebAssembly ν¨μκ° λΉλκΈ° μμ μ μννλ JavaScript ν¨μλ₯Ό νΈμΆνλ κ²½μ°, μ€ν νΈλ μ΄μ€μ μλ WebAssembly ν¨μ νΈμΆμ΄ ν¬ν¨λμ§ μμ μ μμ΅λλ€. μ΄λ¬ν κ³Όμ λ₯Ό ν΄κ²°νκΈ° μν΄ κ°λ°μλ μ€ν 컨ν μ€νΈλ₯Ό μ μ€νκ² κ΄λ¦¬νκ³ μ νν μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλ λ° νμν μ λ³΄κ° μλμ§ νμΈν΄μΌ ν©λλ€. ν κ°μ§ μ κ·Ό λ°©μμ λΉλκΈ° μμ μ΄ μμλ μμ μ μ€ν νΈλ μ΄μ€λ₯Ό μΊ‘μ²ν λ€μ μμ μ΄ μλ£λ μμ μ μ€ν νΈλ μ΄μ€μ κ²°ν©ν μ μλ λΉλκΈ° μ€ν νΈλ μ΄μ€ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ λλ€.
λ λ€λ₯Έ μ κ·Ό λ°©μμ ꡬ쑰νλ λ‘κΉ μ μ¬μ©νλ κ²μ λλ€. μ΄λ μ½λμ λ€μν μ§μ μμ μ€ν 컨ν μ€νΈμ λν κ΄λ ¨ μ 보λ₯Ό λ‘κΉ νλ κ²μ ν¬ν¨ν©λλ€. κ·Έλ° λ€μ μ΄ μ 보λ₯Ό μ¬μ©νμ¬ μ€ν κ²½λ‘λ₯Ό μ¬κ΅¬μ±νκ³ λ μμ ν μ€ν νΈλ μ΄μ€λ₯Ό μμ±ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, κ° ν¨μ νΈμΆμ μμκ³Ό λμμ ν¨μ μ΄λ¦, νμΌ μ΄λ¦, μ€ λ²νΈ λ° κΈ°ν κ΄λ ¨ μ 보λ₯Ό λ‘κΉ ν μ μμ΅λλ€. μ΄λ 볡μ‘ν λΉλκΈ° μμ μ λλ²κΉ νλ λ° νΉν μ μ©ν μ μμ΅λλ€. JavaScriptμ `console.log`μ κ°μ λΌμ΄λΈλ¬λ¦¬λ ꡬ쑰νλ λ°μ΄ν°λ‘ 보κ°λ λ λ§€μ° μ μ©ν μ μμ΅λλ€.
μ€λ₯ 컨ν μ€νΈ 보쑴μ μν λͺ¨λ² μ¬λ‘
WebAssembly μ ν리μΌμ΄μ μ΄ μλ―Έ μλ μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλλ‘ νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μμμ€.
- μμ€ λ§΅ μμ±: μ½λλ₯Ό WebAssemblyλ‘ μ»΄νμΌν λ νμ μμ€ λ§΅μ μμ±νμμμ€. μ»΄νμΌλ¬λ₯Ό ꡬμ±νμ¬ λλ²κΉ μ 보λ₯Ό ν¬ν¨νκ³ μ»΄νμΌλ μ½λλ₯Ό μλ³Έ μμ€ μ½λλ‘ λ€μ λ§€ννλ μμ€ λ§΅μ μμ±νμμμ€.
- λλ²κ·Έ μ 보 보쑴: λλ²κΉ μ 보λ₯Ό μ κ±°νλ 곡격μ μΈ μ΅μ νλ₯Ό νΌνμμμ€. μ±λ₯κ³Ό λλ²κΉ μ©μ΄μ±μ κ· νμ λ§μΆλ μ μ ν μ΅μ ν μμ€μ μ¬μ©νμμμ€. κ°λ° λ° νλ‘λμ μ λν΄ λ³λμ λΉλ ꡬμ±μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- λ€λ₯Έ νκ²½μμ ν μ€νΈ: μ€ν νΈλ μ΄μ€κ° μ¬λ°λ₯΄κ² μμ±λκ³ μλ―Έ μλ μ 보λ₯Ό μ 곡νλμ§ νμΈνκΈ° μν΄ λ€μν λ°νμ νκ²½μμ WebAssembly μ ν리μΌμ΄μ μ ν μ€νΈνμμμ€.
- λΉλκΈ° μ€ν νΈλ μ΄μ€ λΌμ΄λΈλ¬λ¦¬ μ¬μ©: μ ν리μΌμ΄μ μ λΉλκΈ° μμ μ΄ ν¬ν¨λ κ²½μ°, λΉλκΈ° μ€ν νΈλ μ΄μ€ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λΉλκΈ° μμ μ΄ μμλ μμ μ μ€ν νΈλ μ΄μ€λ₯Ό μΊ‘μ²νμμμ€.
- ꡬ쑰νλ λ‘κΉ κ΅¬ν: μ½λμ λ€μν μ§μ μμ μ€ν 컨ν μ€νΈμ λν κ΄λ ¨ μ 보λ₯Ό λ‘κΉ νκΈ° μν΄ κ΅¬μ‘°νλ λ‘κΉ μ ꡬννμμμ€. μ΄ μ 보λ μ€ν κ²½λ‘λ₯Ό μ¬κ΅¬μ±νκ³ λ μμ ν μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλ λ° μ¬μ©ν μ μμ΅λλ€.
- μ€λͺ μ μΈ μ€λ₯ λ©μμ§ μ¬μ©: μμΈλ₯Ό λ°μμν¬ λ μ€λ₯μ μμΈμ λͺ ννκ² μ€λͺ νλ μ€λͺ μ μΈ μ€λ₯ λ©μμ§λ₯Ό μ 곡νμμμ€. μ΄λ κ² νλ©΄ κ°λ°μκ° λ¬Έμ λ₯Ό μ μνκ² μ΄ν΄νκ³ μ€λ₯μ μΆμ²λ₯Ό μλ³νλ λ° λμμ΄ λ©λλ€. μλ₯Ό λ€μ΄, μΌλ°μ μΈ "Error" μμΈλ₯Ό λ°μμν€λ λμ , μλͺ»λ μΈμκ° λ¬΄μμΈμ§ μ€λͺ νλ λ©μμ§μ ν¨κ» "InvalidArgumentException"κ³Ό κ°μ λ ꡬ체μ μΈ μμΈλ₯Ό λ°μμν€μμμ€.
- μ μ© μ€λ₯ λ³΄κ³ μλΉμ€ μ¬μ© κ³ λ €: Sentry, Bugsnag λ° Rollbarμ κ°μ μλΉμ€λ WebAssembly μ ν리μΌμ΄μ μμ μ€λ₯λ₯Ό μλμΌλ‘ μΊ‘μ²νκ³ λ³΄κ³ ν μ μμ΅λλ€. μ΄λ¬ν μλΉμ€λ μΌλ°μ μΌλ‘ μ€λ₯λ₯Ό μ§λ¨νκ³ μμ νλ λ° λμμ΄ λλ μμΈν μ€ν νΈλ μ΄μ€μ κΈ°ν μ 보λ₯Ό μ 곡ν©λλ€. λν μ€λ₯ κ·Έλ£Ήν, μ¬μ©μ 컨ν μ€νΈ λ° λ¦΄λ¦¬μ€ μΆμ κ³Ό κ°μ κΈ°λ₯λ μ 곡νλ κ²½μ°κ° λ§μ΅λλ€.
μμ λ° λ°λͺ¨
μ€μ μμ λ₯Ό ν΅ν΄ μ΄λ¬ν κ°λ μ μ€λͺ ν΄ λ³΄κ² μ΅λλ€. Emscriptenμ μ¬μ©νμ¬ WebAssemblyλ‘ μ»΄νμΌλ κ°λ¨ν C++ νλ‘κ·Έλ¨μ κ³ λ €ν΄ λ³΄κ² μ΅λλ€.
C++ μ½λ (example.cpp):
#include <iostream>
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero!");
}
return a / b;
}
int main() {
try {
int result = divide(10, 0);
std::cout << "Result: " << result << std::endl;
} catch (const std::runtime_error& ex) {
std::cerr << "Error: " << ex.what() << std::endl;
}
return 0;
}
EmscriptenμΌλ‘ μ»΄νμΌ:
emcc example.cpp -o example.js -s WASM=1 -g
μ΄ μμμλ λλ²κΉ μ 보λ₯Ό μμ±νκΈ° μν΄ `-g` νλκ·Έλ₯Ό μ¬μ©ν©λλ€. `divide` ν¨μκ° `b = 0`μΌλ‘ νΈμΆλλ©΄ `std::runtime_error` μμΈκ° λ°μν©λλ€. `main`μ catch λΈλ‘μ μμΈλ₯Ό μ‘κ³ μ€λ₯ λ©μμ§λ₯Ό μΆλ ₯ν©λλ€. κ°λ°μ λκ΅¬κ° μ΄λ¦° λΈλΌμ°μ μμ μ΄ μ½λλ₯Ό μ€ννλ©΄ νμΌ μ΄λ¦(`example.cpp`), μ€ λ²νΈ λ° ν¨μ μ΄λ¦μ΄ ν¬ν¨λ μ€ν νΈλ μ΄μ€κ° νμλ©λλ€. μ΄λ₯Ό ν΅ν΄ μ€λ₯μ μΆμ²λ₯Ό μ μνκ² μλ³ν μ μμ΅λλ€.
Rust μμ :
Rustμ κ²½μ°, `wasm-pack` λλ `cargo build --target wasm32-unknown-unknown`μ μ¬μ©νμ¬ WebAssemblyλ‘ μ»΄νμΌνλ©΄ μμ€ λ§΅ μμ±λ κ°λ₯ν©λλ€. `Cargo.toml`μ νμν ꡬμ±μ΄ μλμ§ νμΈνκ³ , μ€μν λλ²κ·Έ μ 보λ₯Ό 보쑴νκΈ° μν΄ κ°λ°μλ λλ²κ·Έ λΉλλ₯Ό μ¬μ©νμμμ€.
JavaScriptμ WebAssemblyμ λ°λͺ¨:
WebAssemblyλ₯Ό JavaScriptμ ν΅ν©ν μλ μμ΅λλ€. JavaScript μ½λλ WebAssembly λͺ¨λμ λ‘λνκ³ μ€νν μ μμΌλ©°, WebAssembly μ½λμμ λ°μν μμΈλ μ²λ¦¬ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ WebAssemblyμ μ±λ₯κ³Ό JavaScriptμ μ μ°μ±μ κ²°ν©ν νμ΄λΈλ¦¬λ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. WebAssembly μ½λμμ μμΈκ° λ°μνλ©΄ JavaScript μ½λκ° μμΈλ₯Ό μ‘κ³ `console.trace()` ν¨μλ₯Ό μ¬μ©νμ¬ μ€ν νΈλ μ΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
κ²°λ‘
WebAssembly μ€ν νΈλ μ΄μ€μμ μ€λ₯ 컨ν μ€νΈλ₯Ό 보쑴νλ κ²μ κ°λ ₯νκ³ λλ²κΉ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μ€μν©λλ€. μ΄ κΈμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ κ°λ°μλ WebAssembly μ ν리μΌμ΄μ μ΄ μ€λ₯λ₯Ό μ§λ¨νκ³ μμ νλ λ° κ·μ€ν μ 보λ₯Ό μ 곡νλ μλ―Έ μλ μ€ν νΈλ μ΄μ€λ₯Ό μμ±νλλ‘ ν μ μμ΅λλ€. μ΄λ WebAssemblyκ° λ λ리 μ±νλκ³ μ μ λ 볡μ‘ν μ ν리μΌμ΄μ μ μ¬μ©λ¨μ λ°λΌ νΉν μ€μν©λλ€. μ μ ν μ€λ₯ μ²λ¦¬ λ° λλ²κΉ κΈ°μ μ ν¬μνλ κ²μ μ₯κΈ°μ μΌλ‘ 보μμ΄ λ κ²μ΄λ©°, λ€μν κΈλ‘λ² νκ²½μμ λ μμ μ μ΄κ³ μ λ’°ν μ μμΌλ©° μ μ§ κ΄λ¦¬ κ°λ₯ν WebAssembly μ ν리μΌμ΄μ μ λ§λ€ μ μμ κ²μ λλ€.
WebAssembly μνκ³κ° λ°μ ν¨μ λ°λΌ μμΈ μ²λ¦¬ λ° μ€ν νΈλ μ΄μ€ μμ±μμ μΆκ°μ μΈ κ°μ μ κΈ°λν μ μμ΅λλ€. κ°λ ₯νκ³ λλ²κΉ κ°λ₯ν WebAssembly μ ν리μΌμ΄μ μ ꡬμΆνλ κ²μ λμ± μ½κ² λ§λ€μ΄μ£Όλ μλ‘μ΄ λꡬμ κΈ°μ μ΄ λ±μ₯ν κ²μ λλ€. μ΄λ¬ν κ°λ ₯ν κΈ°μ μ μ μ¬λ ₯μ μ΅λν νμ©νλ €λ κ°λ°μμκ²λ WebAssemblyμ μ΅μ λ°μ μ λν μ΅μ μ 보λ₯Ό μ μ§νλ κ²μ΄ νμμ μ λλ€.